package com.hqyj.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * 项目:rabbitmq-230301-provider
 * 描述: 死信队列配置
 * 时间:2023/8/4 10:16
 * 作者:admin
 * 版本:1.0
 **/
//@Configuration
public class OrderMqConfig {
    /**
     * 消息转换器
     * @return
     */
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 订单队列
     * @return
     */
    @Bean
    public Queue orderQueue(){
        Map<String,Object> map = new HashMap<>(2);
        //设置订单队列对应的死信交换机
        map.put("x-dead-letter-exchange","deadExchange");
        //设置订单队列对应的死信交换机的路由地址
        map.put("x-dead-letter-routing-key","deadRout");
        return  new Queue("orderQueue",true,false,false,map);
    }
    /**
     * 死信队列
     * @return
     */
    @Bean
    public Queue deadQueue(){
        return  new Queue("deadQueue",true,false,false);
    }

    /**
     * 绑定订单队列的交换机
     * @return
     */
    @Bean
    public DirectExchange orderExchange(){
        /**
         * 1. Name，Exchange 的名字；
         * 2. Durability，是否是持久的 Exchange，当为真时，broker 重启后也会保留此 Exchange；
         * 3. Auto-delte，当为真时，如果所有绑定的 Queue 都不再使用时，此 Exchange 会自动删除。
         */
        return new DirectExchange("orderExchange",true,false);
    }
    /**
     * 绑定死信队列的交换机
     * @return
     */
    @Bean
    public DirectExchange deadExchange(){
        /**
         * 1. Name，Exchange 的名字；
         * 2. Durability，是否是持久的 Exchange，当为真时，broker 重启后也会保留此 Exchange；
         * 3. Auto-delte，当为真时，如果所有绑定的 Queue 都不再使用时，此 Exchange 会自动删除。
         */
        return new DirectExchange("deadExchange",true,false);
    }
    //绑定订单队列
    @Bean
    public Binding bindOrder(){
       return BindingBuilder.bind(orderQueue()).to(orderExchange()).with("orderRout");
    }
    //绑定死信队列
    @Bean
    public Binding bindDead(){
        return BindingBuilder.bind(deadQueue()).to(deadExchange()).with("deadRout");
    }


}
